import java.util.*;

/*
Floyd求最短路
给定一个 n个点 m条边的有向图，图中可能存在重边和自环，边权可能为负数。
再给定 k个询问，每个询问包含两个整数 x 和 y，表示查询从点 x到点 y的最短距离，如果路径不存在，则输出 impossible。
数据保证图中不存在负权回路。

输入格式
第一行包含三个整数 n,m,k。
接下来 m行，每行包含三个整数x,y,z，表示存在一条从点 x到点 y的有向边，边长为 z。
接下来 k 行，每行包含两个整数 x,y，表示询问点 x到点 y的最短距离。

输出格式
共 k行，每行输出一个整数，表示询问的结果，若询问两点间不存在路径，则输出 impossible。

数据范围
1≤n≤200,
1≤k≤n^2,
1≤m≤20000,
图中涉及边长绝对值均不超过10000。

输入样例：
3 3 2
1 2 1
2 3 2
1 3 1
2 1
1 3

输出样例：
impossible
1
 */
public class Main {
    static int n, m, k;
    static int[][] graph = new int[205][205];

    static void floyd() {
        for (int k = 1; k <= n; k++) {
            for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= n; j++) {
                    graph[i][j] = Math.min(graph[i][j], graph[i][k] + graph[k][j]);
                }
            }
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        k = sc.nextInt();
        for (int[] row : graph) {
            Arrays.fill(row, 0x3f3f3f3f);
        }
        for (int i = 0; i < m; i++) {
            int x = sc.nextInt(), y = sc.nextInt(), z = sc.nextInt();
            if (x == y) continue;
            graph[x][y] = Math.min(graph[x][y], z);
        }
        floyd();
        for (int i = 0; i < k; i++) {
            int x = sc.nextInt(), y = sc.nextInt();
            if (graph[x][y] > 0x3f3f3f3f / 2) System.out.println("impossible");
            else System.out.println(graph[x][y]);
        }
    }
}